from wtforms import StringField, IntegerField
from wtforms.validators import ValidationError, DataRequired, Regexp, Length

from app.models import AuthRole
from app.common.enums import AuthRoleStatus, RegexpEnum

from app.form.base_form import BaseForm


class AuthRoleForm(BaseForm):
    """认证角色表单验证
    """
    id = IntegerField('记录ID')
    role_code = StringField(validators=[
        DataRequired('角色代码不允许为空'),
        Length(4, 255, '角色代码长度4~255字符'),
        Regexp(regex=RegexpEnum.words, message='角色代码为字母和数字组合')
    ])
    role_name = StringField(validators=[
        DataRequired('角色名称不允许为空'),
        Length(max=255, message='角色名称最大长度255字符'),
    ])
    role_status = IntegerField("角色状态")
    description = StringField(validators=[Length(max=255, message='角色名称最大长度255字符')])

    def validate_role_code(self, field):
        """验证角色代码是否已经存在
        """
        # 如果添加，判断角色代码是否已经存在
        # 如果修改，修改到的角色代码不能已经存在
        data = AuthRole.query.filter_by(role_code=field.data).first()
        id = self.id.data
        if (id is not None) and (data is not None) and (not data.id == id):
            raise ValidationError(message=f"角色代码{field.data}已存在")
        # 没传入id，添加操作，只需要判断是否存在记录
        if (id is None) and (data is not None):
            raise ValidationError(message=f"角色代码{field.data}已存在")

    def validate_role_status(self, field):
        """角色状态验证
        """
        type_dict = AuthRoleStatus._value2member_map_
        if int(field.data) not in type_dict:
            raise ValidationError(message="未知的角色状态")
